#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>

int main()
{
    // 使用dup2(fd, 0); 将标准输入替换成一个文件
    //int fd = open("./log.txt", O_RDWR, 0664);
    //dup2(fd, 0);
    //char buffer[1024] = {0};
    //while(fgets(buffer, sizeof(buffer) - 1, stdin)) {
    //    fputs(buffer, stdout);
    //}

    // 使用dup2(fd, 1);将标准输出替换成一个文件
    int fd = open("./log.txt",O_RDWR | O_TRUNC);
    dup2(fd, 1);
    printf("hello printf\n");
    fprintf(stdout, "hello fprintf\n");
    fputs("hello fputs\n", stdout);
    


    // 测试提前关闭标准输入输出流
   // close(0);
    //close(2);
    //close(1);   // 如果将1提前关闭了，那么标准输出就被关闭了，取而代之的是新创建的fd，那么现在的1号fd指向着新fd，那么此时printf默认是向标准输出进行打印字符，那么此时就会向此刻fd所指向的文件流打印，因此就会出现fd = 1 被打印在了文件lod.txt中
    // fd 的分配机制：是从fd_array[]中找一个下标最小的，未被使用的fd分配给他
    // 输出重定向
    //int fd = open("./log.txt", O_WRONLY | O_CREAT, 0664);
    //printf("fd = %d\n", fd);
    //char buffer[1024] = {0};
    //ssize_t fs = read(fd, buffer, sizeof(buffer) - 1);
    //buffer[fs - 1] = '\0';
    //printf("%s\n", buffer);
    
    // 输入重定向
    //int fd = open("./log.txt", O_WRONLY);
    //const char* buffer = "hhhhjjjj";
    //printf("fd = %d\n", fd);
    //write(fd, buffer, sizeof(buffer) - 1);
    ////while (fgets(buffer, sizeof(buffer) - 1,stdin)) {
    //   printf("%s", buffer);
    ////}

   /*
    // 向标准输入/输出里面写数据，读数据
    // fd  0       1       2
    //   键盘   显示器   显示器
    char buffer[1024] = {0};
    ssize_t fs = read(1, buffer, sizeof(buffer));
    buffer[fs - 1] = '\0';
    printf("%s\n", buffer);
    write(0, "aaa", 3);
    */

    /*
     *
    int fd = open("./log.txt", O_RDONLY);

   // read 测试
   char buffer[1024] = {0};
   ssize_t fs = read(fd, buffer, sizeof(buffer) - 1);
   buffer[fs - 1] = '\0';   // 在本实验中，将字符串输入进去的时候，末尾有一个\n ，而其在读出的时候，位置是最后一个，fs是当前读取的字节数，因此fs  - 1 就指向了末尾\n
   printf ("%s\n", buffer);
  **/

    /*
     * write 测试
    //int fd = open("./log.txt", O_WRONLY | O_CREAT, 0664);
    FILE* fd = fopen("./log.txt", "w+");
    if (fd == NULL) {
        perror("open faild::");
        return 1;
    }

    const char* buffer = "can you see me?\n";
    int cnt = 5;
    while (cnt--) {
         //write(fd ,buffer, strlen(buffer));
         fputs(buffer, fd);
    }
    */
    //close(fd);
    return 0;
}
